// Copyright (C) 2022 smr.
// SPDX-License-Identifier: MIT
// https://0smr.github.io

import QtQuick 2.15
import QtQuick.Controls 2.15
/*
Control 是 Qt Quick Controls 2 中的基类控件，用于创建自定义 UI 组件。
它不直接渲染内容，而是提供基础属性和结构，如 padding、background、contentItem 等。
其他控件（如 Button、TextField）都继承自它。你可以用它作为根元素来构建自己的控件。
ShaderEffect 允许你在 QML 中使用自定义的 OpenGL 着色器来渲染内容。
此处的 NeumEffect.qml 使用 ShaderEffect 来实现 Neumorphism（新拟态设计）效果。
作为其他控件的基类
*/
Control {
    id: control

    property bool inward: false
    property alias color: effect.color
    property alias light: effect.light
    property alias dark: effect.dark

    property real spread
    property real angle
    property real pad
    property real blend

    property var radius: NaN

    contentItem: ShaderEffect {
        id: effect

        implicitWidth: 100
        implicitHeight: 100

        property real _min: Math.min(width, height)
        property size size: Qt.size(width, height)

        property real style: control.inward

        property color color: control.palette.button
        // Hue 色相; Saturation 饱和度; Lightness 亮度; Alpha 透明度;
        property color light: Qt.hsla(0, 0, color.hslLightness + 0.3, 1)
        property color dark: Qt.hsla(0, 0, color.hslLightness - 0.3, 1)

        // control.spread 等参数除以 _min 的原因: 像素单位进行归一化 [0，1] 符合Shader的坐标范围 在Shader中方便处理
        // Shader中使用 _min 来归一化 (UV坐标); -> 便于处理时使用相对大小 而不是绝对像素值 <-
        // angle 转为弧度制 (乘以 0.017453 即 π/180)  用于计算 normalize( vec2(sin(angle), cos(angle)) )
        // 除以 _min 是为了将像素值转换为相对值，适应不同大小的控件
        property vector4d attrs: Qt.vector4d(control.spread / _min, control.angle * 0.017453,
                                             control.pad / _min, control.blend / _min);
        property vector4d radius: {
            if(Number.isFinite(control.radius)) {
                const r = control.radius/_min;
                return Qt.vector4d(r,r,r,r);
            } else {
                const {x,y,z,w} = control.radius;
                //z ?? x, z为null时取x;     w ?? y 同理
                return Qt.vector4d(x,y, z ?? x, w ?? y);
            }
        }

        fragmentShader: "qrc:/Neumorphism/shaders/neum.frag.qsb"
    }
}
